package cn.yx.common.core.util.date;

import cn.yx.common.core.enums.date.DatePassEnum;

import java.time.Instant;
import java.time.LocalDateTime;
import java.util.Calendar;
import java.util.Date;

/**
 * <p>计算多少时间前的工具类</p>
 *
 * @author Wgssmart
 */
public final class DatePassUtil {

    /**
     * 1000毫秒
     */
    private static final long THOUSAND_MILLIS = 1000L;
    /**
     * 60秒
     */
    private static final long SIXTY_SECONDS = 60 * 1000L;
    /**
     * 60分钟
     */
    private static final long SIXTY_MINUTES = 60 * SIXTY_SECONDS;
    /**
     * 24小时
     */
    private static final long TWENTY_FOUR_HOURS = 24 * SIXTY_MINUTES;
    /**
     * 2天
     */
    private static final long TWO_DAYS = 2 * TWENTY_FOUR_HOURS;
    /**
     * 7天
     */
    private static final long SEVEN_DAYS = 7 * TWENTY_FOUR_HOURS;

    private DatePassUtil() {
    }

    /**
     * 用于计算前后两个时间相差的时间数，显示出x秒前，x分钟前，x小时前，昨天，x天前，或具体的时间
     *
     * @param pastTimeMillis 过去的时间毫秒值
     * @param nowTimeMillis  现在的时间毫秒值，应大于等于pastTimeMillis参数
     * @return 计算后得到的x秒前，x分钟前，x小时前，昨天，x天前，或具体的时间
     */
    public static String passTime(long pastTimeMillis, long nowTimeMillis) {
        long pastTime = nowTimeMillis - pastTimeMillis;
        if (pastTime < SIXTY_SECONDS) {
            return pastTime / THOUSAND_MILLIS + DatePassEnum.SECONDS_PASS.getValue();
        }
        if (pastTime < SIXTY_MINUTES) {
            return pastTime / SIXTY_SECONDS + DatePassEnum.MINUTES_PASS.getValue();
        }
        if (pastTime < TWENTY_FOUR_HOURS) {
            return pastTime / SIXTY_MINUTES + DatePassEnum.HOURS_PASS.getValue();
        }
        if (pastTime < TWO_DAYS) {
            return DatePassEnum.YESTERDAY.getValue();
        }
        if (pastTime < SEVEN_DAYS) {
            return pastTime / TWENTY_FOUR_HOURS + DatePassEnum.DAYS_PASS.getValue();
        }
        return DateFormatUtil.format(pastTimeMillis);
    }

    /**
     * 返回时间和单位组成的对象数组，如果不需要单位，则单位部分为null。在调用此方法的服务中，可根据返回的单位获取该单位对应的国际化信息
     *
     * @param pastTimeMillis
     * @param nowTimeMillis
     * @return 时间和DatePassEnum枚举组成的对象数组
     */
    public static Object[] passTimeWithUnit(long pastTimeMillis, long nowTimeMillis) {
        long pastTime = nowTimeMillis - pastTimeMillis;
        if (pastTime < SIXTY_SECONDS) {
            return new Object[]{pastTime / THOUSAND_MILLIS + "", DatePassEnum.SECONDS_PASS};
        }
        if (pastTime < SIXTY_MINUTES) {
            return new Object[]{pastTime / SIXTY_SECONDS + "", DatePassEnum.MINUTES_PASS.getValue()};
        }
        if (pastTime < TWENTY_FOUR_HOURS) {
            return new Object[]{pastTime / SIXTY_MINUTES + "", DatePassEnum.HOURS_PASS.getValue()};
        }
        if (pastTime < TWO_DAYS) {
            return new Object[]{"", DatePassEnum.YESTERDAY.getValue()};
        }
        if (pastTime < SEVEN_DAYS) {
            return new Object[]{pastTime / TWENTY_FOUR_HOURS + "", DatePassEnum.DAYS_PASS.getValue()};
        }
        return new Object[]{DateFormatUtil.format(pastTimeMillis), null};
    }

    /**
     * 两个LocalDateTime相比较的结果
     *
     * @param past 过去时间的LocalDateTime实例
     * @param now  现在时间的LocalDateTime实例
     * @return 计算后得到的x秒前，x分钟前，x小时前，昨天，x天前，或具体的时间
     */
    public static String passTime(LocalDateTime past, LocalDateTime now) {
        return passTime(DateUtil.millis(past), DateUtil.millis(now));
    }

    /**
     * 两个Instant相比较的结果
     *
     * @param past 过去时间的Instant实例
     * @param now  现在时间的Instant实例
     * @return 计算后得到的x秒前，x分钟前，x小时前，昨天，x天前，或具体的时间
     */
    public static String passTime(Instant past, Instant now) {
        return passTime(DateUtil.millis(past), DateUtil.millis(now));
    }

    /**
     * 两个日历相比较的结果
     *
     * @param past 过去时间的Calendar实例
     * @param now  现在时间的Calendar实例
     * @return 计算后得到的x秒前，x分钟前，x小时前，昨天，x天前，或具体的时间
     */
    @Deprecated
    public static String passTime(Calendar past, Calendar now) {
        return passTime(past.getTimeInMillis(), now.getTimeInMillis());
    }

    /**
     * 两个Date实例相比较的结果
     *
     * @param past 过去时间的Date实例
     * @param now  现在时间的Date实例
     * @return 计算后得到的x秒前，x分钟前，x小时前，昨天，x天前，或具体的时间
     */
    public static String passTime(Date past, Date now) {
        return passTime(past.getTime(), now.getTime());
    }

    /**
     * 当前系统时间与过去时间比较的结果
     *
     * @param pastTimeMillis 过去时间的毫秒值
     * @return 计算后得到的x秒前，x分钟前，x小时前，昨天，x天前，或具体的时间
     */
    public static String passTime(long pastTimeMillis) {
        return passTime(pastTimeMillis, Instant.now().toEpochMilli());
    }

    /**
     * 当前系统时间与过去时间比较的结果
     *
     * @param past 过去时间的Calendar实例
     * @return 计算后得到的x秒前，x分钟前，x小时前，昨天，x天前，或具体的时间
     */
    public static String passTime(LocalDateTime past) {
        return passTime(past, LocalDateTime.now());
    }

    /**
     * 当前系统时间与过去时间比较的结果
     *
     * @param past 过去时间的Calendar实例
     * @return 计算后得到的x秒前，x分钟前，x小时前，昨天，x天前，或具体的时间
     */
    @Deprecated
    public static String passTime(Calendar past) {
        return passTime(past, Calendar.getInstance());
    }

    /**
     * 当前系统时间与过去时间比较的结果
     *
     * @param past 过去时间的Date实例
     * @return 计算后得到的x秒前，x分钟前，x小时前，昨天，x天前，或具体的时间
     */
    public static String passTime(Date past) {
        return passTime(past.getTime(), Calendar.getInstance().getTimeInMillis());
    }

}
